package com.zhb.cloud.template;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import freemarker.template.Version;

/**
 * 
 * 模板工具类
 */
public class FreeMarkertUtil {
	private static Configuration config=new Configuration(new Version(2, 3, 23));
	/**
	 * @Title: processTemplate 
	 * @Description: 代码生成
	 * @return void 
	 * @author zhb
	 * @param templatePath 模板文件存放目录 
	 * @param templateName 模板文件名称 
	 * @param root 数据模型根对象
	 * @param templateEncoding 模板文件的编码方式
	 * @param out 输出流
	 * 2016年1月15日下午4:47:56
	 */
	public static void processTemplate(String templatePath, String templateName, String templateEncoding, Map<?,?> root, Writer out){
		try {
			Configuration config=new Configuration(new Version(2, 3, 23));
			File file=new File(templatePath);
			//设置要解析的模板所在的目录，并加载模板文件
			config.setDirectoryForTemplateLoading(file);
			//设置包装器，并将对象包装为数据模型
			config.setObjectWrapper(new DefaultObjectWrapper(new Version(2, 3, 23)));
			
			//获取模板,并设置编码方式，这个编码必须要与页面中的编码格式一致
			Template template=config.getTemplate(templateName,templateEncoding);
			//合并数据模型与模板
		    template.process(root, out);
		    out.flush();
		    out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}catch (TemplateException e) {
			e.printStackTrace();
		}
	}
	/**
	 * @Title: generate 
	 * @Description: 自动生成代码
	 * @return void 
	 * @author zhb
	 * @param templateFile
	 * @param params
	 * @param outputDir
	 * @param outputFile
	 * @throws IOException
	 * @throws TemplateException
	 * 2016年1月15日下午4:52:29
	 */
	public static void generate(String templateFile,Map<String,Object> params,String outputDir, String outputFile) throws IOException, TemplateException{
		config.setClassForTemplateLoading(FreeMarkertUtil.class, "/");
		config.setObjectWrapper(new DefaultObjectWrapper(new Version(2, 3, 23)));
		config.setDefaultEncoding("UTF-8");
		config.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
		config.setIncompatibleImprovements(new Version(2, 3, 23));
		Template temp=config.getTemplate(templateFile);
		File dir=new File(outputDir);
		if(!dir.exists()){
			FileUtils.forceMkdir(dir);
		}
		String toGenFile=outputDir + File.separator + outputFile;
		File file=new File(toGenFile);
		if(file.exists()){
			toGenFile+="." + System.currentTimeMillis();
			file=new File(toGenFile);
		}
		Writer out = new OutputStreamWriter(new FileOutputStream(file));
		temp.process(params, out);
	}
	/**
	 * @Title: getParams 
	 * @Description:转换驼峰模式
	 * @return void 
	 * @author zhb
	 * @param table
	 * @throws Exception
	 * 2016年1月15日下午5:11:06
	 */
	public static Map<String,Object> getParams(String table) throws Exception {
		Map<String,Object> params = new HashMap<String, Object>();
		List<String> columnList = TableAndColumnUtil.getColumnByTable(table);
		params.put("modelName", CamleNameUtil.camelNameWithoutProfix(table));
		params.put("columnList",columnList);
		return params;
	}
}
